/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "src/core/SkAlphaRuns.h"

#include "src/core/SkMemset.h"

void SkAlphaRuns::reset(int width)
{
    SkASSERT(width > 0);

#ifdef SK_DEBUG
    SkOpts::memset16((uint16_t *)fRuns, (uint16_t)(-42), width);
#endif
    fRuns[0] = SkToS16(width);
    fRuns[width] = 0;
    fAlpha[0] = 0;

    SkDEBUGCODE(fWidth = width;) SkDEBUGCODE(this->validate();)
}

#ifdef SK_DEBUG
void SkAlphaRuns::assertValid(int y, int maxStep) const
{
    int max = (y + 1) * maxStep - (y == maxStep - 1);

    const int16_t *runs = fRuns;
    const uint8_t *alpha = fAlpha;

    while (*runs) {
        SkASSERT(*alpha <= max);
        alpha += *runs;
        runs += *runs;
    }
}

void SkAlphaRuns::dump() const
{
    const int16_t *runs = fRuns;
    const uint8_t *alpha = fAlpha;

    SkDebugf("Runs");
    while (*runs) {
        int n = *runs;

        SkDebugf(" %02x", *alpha);
        if (n > 1) {
            SkDebugf(",%d", n);
        }
        alpha += n;
        runs += n;
    }
    SkDebugf("\n");
}

void SkAlphaRuns::validate() const
{
    SkASSERT(fWidth > 0);

    int count = 0;
    const int16_t *runs = fRuns;

    while (*runs) {
        SkASSERT(*runs > 0);
        count += *runs;
        SkASSERT(count <= fWidth);
        runs += *runs;
    }
    SkASSERT(count == fWidth);
}
#endif
